# 2024.06.24——比特Python代码案例
# 学生管理系统
import sys
import time
import os

# 需求说明——实现一个命令行版的学生管理系统
# 功能:
# 1.新增学生
# 2.显示学生
# 3.查找学生
# 4.删除学生
# 5.存档到文件
#   1.在存储文件时，需要先约定好数据的存储格式——把数据存储在.py文件的同级文件夹中，命名为student.txt
#   2.文件内容按照行文本的方式来表示——文本格式——班级\t学号\t姓名\t性别\n
#   3.通过save函数来存储文件信息
#   4.通过load函数来读取本地文件信息
# 通过列表来记录所有学生信息
student_list = []


def save():
    """
    通过save来存储文件信息
    :return:
    """
    # 通过with open这种方式来确保文件放置在与.py文件的同级目录中
    # 以写的方式打开，如果没有该文件，则会自动生成一个对应的文件
    # 该文件路径为相对路径，因此我们不需要额外创建
    with open('student.txt', 'w', encoding='utf-8') as f:
        for student in student_list:
            f.write(f"{student['classId']}\t{student['studentId']}\t{student['name']}\t{student['sex']}\n")
    print(f'文件保存成功，共存储了{len(student_list)}条学生信息')


def load():
    """
    通过load用了读取本地已保存的学生信息
    :return:
    """
    if not os.path.exists('student.txt'):
        return
    # 读取学生信息之前，先初始化全局变量
    global student_list
    student_list = []
    # 打开本地文件
    with open('student.txt', 'r', encoding='utf-8') as f:
        for s in f.readlines():
            # 通过strip方法完成每行的开头与末尾的空白信息（空格、制表符、换行等信息）
            s = s.strip()
            # 分割字符串——以制表符为分割点开始分割字符串
            line = s.split('\t')
            if len(line) != 4:
                print(f'该行文件格式有误，请检查文件信息{line}')
            else:
                student = {
                    'classId': line[0],
                    'studentId': line[1],
                    'name': line[2],
                    'sex': line[3],
                }
                student_list.append(student)
    print(f"完成本地文件读取，共读取了{len(student_list)}条学生信息")


def insert():
    print('开始添加学生信息：')
    # 添加学生信息需要添加学生所在班级、学生学号、学生姓名、学生性别
    classId = input('请输入学生所在班级：')
    studentId = input('请输入学生学号：')
    name = input('请输入学生姓名：')
    sex = input('请输入学生性别：')
    while sex not in ['男', '女']:
        print('性别输入有误，请输入<男/女>其中一种')
        sex = input('请输入学生性别：')
    # 通过字典来打包学生信息
    student = {
        'classId': classId,
        'studentId': studentId,
        'name': name,
        'sex': sex,
    }
    # 通过添加操作将学生信息添加到列表中
    global student_list
    student_list.append(student)
    student_list = sorted(student_list, key=lambda x: x['studentId'])
    save()
    print('学生信息添加完毕！！！')


def show():
    print('开始显示学生信息：')
    # 通过遍历列表完成学生信息的打印
    for student in student_list:
        print(f"{student['classId']}\t{student['studentId']}\t{student['name']}\t{student['sex']}")
    print(f'学生信息打印完毕，总共打印了{len(student_list)}名学生')


def find():
    print('开始查找学生信息：')
    # 通过姓名来查找学生
    # 拓展可以通过班级、姓名、学号三个中的其中一个、两个、甚至是三个来进行查找
    # 这里我们简单点通过姓名查找即可
    count = 0
    name = input('请输入要查找学生的姓名：')
    for student in student_list:
        if name == student['name']:
            print(f"{student['classId']}\t{student['studentId']}\t{student['name']}\t{student['sex']}")
            count += 1
    print(f'查找完毕，共查找到了{count}名学生')


def delet():
    print('开始删除学生信息：')
    # 通过学生学号来删除学生
    student_id = input('请输入需要删除学生的学号：')
    global student_list
    # 在列表中找到需要删除的学生所对应的字典
    for student in student_list:
        if student_id == student['studentId']:
            student_list.remove(student)
    save()
    print('学生信息删除完毕！！！')


def menu():
    print('*** 欢迎进入学生管理系统（命令行版） ***')
    print('***         0. 退出程序         ***')
    print('***         1. 新增学生         ***')
    print('***         2. 显示学生         ***')
    print('***         3. 查找学生         ***')
    print('***         4. 删除学生         ***')
    choice = input('请输入您要进行的操作：')
    return choice


def main():
    """
    入口函数
    通过控制台与用户进行交互
    :return:
    """
    # 进入系统前先读取本地学生信息
    load()
    while True:
        # 打印菜单
        choice = menu()
        if choice == '0':
            print("感谢您的使用，再见！！！")
            time.sleep(2)
            sys.exit(0)
        elif choice == '1':
            insert()
        elif choice == '2':
            show()
        elif choice == '3':
            find()
        elif choice == '4':
            delet()
        else:
            print('输入有误，请重新输入!!!')


main()
